/*
 *  Copyright (c) 2022-2022 ForteScarlet <ForteScarlet@163.com>
 *
 *  本文件是 simply-robot (或称 simple-robot 3.x 、simbot 3.x ) 的一部分。
 *
 *  simply-robot 是自由软件：你可以再分发之和/或依照由自由软件基金会发布的 GNU 通用公共许可证修改之，无论是版本 3 许可证，还是（按你的决定）任何以后版都可以。
 *
 *  发布 simply-robot 是希望它能有用，但是并无保障;甚至连可销售和符合某个特定的目的都不保证。请参看 GNU 通用公共许可证，了解详情。
 *
 *  你应该随程序获得一份 GNU 通用公共许可证的复本。如果没有，请看:
 *  https://www.gnu.org/licenses
 *  https://www.gnu.org/licenses/gpl-3.0-standalone.html
 *  https://www.gnu.org/licenses/lgpl-3.0-standalone.html
 *
 */

package love.forte.simboot.spring.autoconfigure

import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.asCoroutineDispatcher
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor


/**
 * 在 `spring-boot-starter` 中提供事件调度器 [CoroutineDispatcher] 的容器。
 */
public open class CoroutineDispatcherContainer(public open val dispatcher: CoroutineDispatcher)


/**
 *
 * 对 [CoroutineDispatcherContainer] 的默认配置类。
 *
 * 将 spring 所提供的线程池实例 [ThreadPoolTaskExecutor] 转化为 [CoroutineDispatcher]
 * 并置于容器中。
 *
 * @author ForteScarlet
 */
public open class CoroutineDispatcherConfiguration {
    /**
     * 默认情况下将spring内部的 [ThreadPoolTaskExecutor] 作为调度器。
     */
    @Bean
    @ConditionalOnMissingBean(CoroutineDispatcherContainer::class)
    public open fun defaultSimbotEventDispatcher(executor: ThreadPoolTaskExecutor): CoroutineDispatcherContainer =
        CoroutineDispatcherContainer(executor.asCoroutineDispatcher())
    
    
}